package com.jsy.goods.controller;

import com.github.pagehelper.PageInfo;
import com.jsy.common.constant.StatusCode;
import com.jsy.common.vo.Result;
import com.jsy.goods.pojo.Goods;
import com.jsy.goods.pojo.Spu;
import com.jsy.goods.service.SpuService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/****
 * @Author:www.jsy.com
 * @Description:
 * @Date www.jsy.com
 *****/

@RestController
@RequestMapping("/spu")
@CrossOrigin
public class SpuController {

    @Autowired
    private SpuService spuService;

    /***
     * Spu分页条件搜索实现
     * @param spu: 查询条件
     * @param page:当前页
     * @param size:每页显示多少条
     * @return 查询结果
     */
    @PostMapping(value = "/search/{page}/{size}" )
    public Result<PageInfo<Spu>> findPage(@RequestBody(required = false) Spu spu, @PathVariable  int page, @PathVariable  int size){
        //调用SpuService实现分页条件查询Spu
        PageInfo<Spu> pageInfo = spuService.findPage(spu, page, size);
        return new Result<PageInfo<Spu>>("查询成功！", pageInfo);
    }

    /***
     * Spu分页搜索实现
     * @param page:当前页
     * @param size:每页显示多少条
     * @return 查询结果
     */
    @GetMapping(value = "/search/{page}/{size}" )
    public Result<PageInfo<Spu>> findPage(@PathVariable  int page, @PathVariable  int size){
        //调用SpuService实现分页查询Spu
        PageInfo<Spu> pageInfo = spuService.findPage(page, size);
        return new Result<PageInfo<Spu>>("查询成功！", pageInfo);
    }

    /***
     * 多条件搜索品牌数据
     * @param spu 查询条件
     * @return 查询结果
     */
    @PostMapping(value = "/search" )
    public Result<List<Spu>> findList(@RequestBody(required = false) Spu spu){
        //调用SpuService实现条件查询Spu
        List<Spu> list = spuService.findList(spu);
        return new Result<List<Spu>>("查询成功！", list);
    }

    /***
     * 根据ID删除品牌数据
     * @param id 主键
     * @return 查询结果
     */
    @DeleteMapping(value = "/{id}" )
    public Result delete(@PathVariable Long id){
        //调用SpuService实现根据主键删除
        spuService.delete(id);
        return new Result(true, StatusCode.OK, "删除成功！");
    }

    /***
     * 修改Spu数据
     * @param spu 更新对象
     * @return 操作结果
     */
    @PutMapping
    public Result update(@RequestBody Spu spu){
        //调用SpuService实现修改Spu
        spuService.update(spu);
        return new Result(true, StatusCode.OK, "修改成功！");
    }

    /***
     * 新增Spu数据
     * @param spu 新增对象
     * @return 操作结果
     */
    @PostMapping("/add")
    public Result add(@RequestBody Spu spu){
        //调用SpuService实现添加Spu
        spuService.add(spu);
        return new Result(true, StatusCode.OK, "添加成功！");
    }

    /***
     * 根据ID查询Spu数据
     * @param id 主键
     * @return 查询结果
     */
    @GetMapping("/{id}")
    public Result<Spu> findById(@PathVariable Long id){
        //调用SpuService实现根据主键查询Spu
        Spu spu = spuService.findById(id);
        return new Result<Spu>("查询成功！", spu);
    }

    /***
     * 查询Spu全部数据
     * @return 查询结果
     */
    @GetMapping
    public Result<List<Spu>> findAll(){
        //调用SpuService实现查询所有Spu
        List<Spu> list = spuService.findAll();
        return new Result<List<Spu>>("查询成功！", list);
    }

    /***
     * 新增Spu数据
     * @param goods 新增对象
     * @return 操作结果
     */
    @PostMapping("/save")
    public Result save(@RequestBody Goods goods){
        //调用SpuService实现添加Spu 和Sku列表
        spuService.saveGoods(goods);
        return new Result(true, StatusCode.OK, "保存成功！");
    }

    /***
     * 查看spu数据
     * @param spuId 查看对象
     * @return 操作结果
     */
    @GetMapping("/goods/{spuId}")
    public Result<Goods> findGoodsBySpuId(@PathVariable Long  spuId){
        //调用SpuService实现修改Spu 和Sku列表
        Goods goods= spuService.findGoodsBySpuId(spuId);
        return new Result<>(true, StatusCode.OK, "查询成功！",goods);
    }

    /***
     * 修改审核状态
     * @param id 商品spu id
     * @return 审核结果
     */
    @PutMapping("/audit/{id}")
    public Result audit(@PathVariable Long  id){
        spuService.audit(id);
        return new Result(true, StatusCode.OK, "审核成功！");
    }

    /***
     * 上架商品
     * @param id 商品spu id
     * @return 操作结果
     */
    @PutMapping("/put/{id}")
    public Result put(@PathVariable Long  id){
        //删除goods分为逻辑删除和物理删除，通常使用逻辑删除
        spuService.put(id);
        return new Result(true, StatusCode.OK, "上架成功！");
    }

    /***
     * 批量上架商品
     * @param ids 商品spu id
     * @return 操作结果
     */
    @PutMapping("/put/many")
    public Result putMany(@RequestBody Long[]  ids){
        //批量上架
        spuService.putMany(ids);
        return new Result(true, StatusCode.OK, "批量上架成功！");
    }

    /***
     * 下架商品
     * @param id 商品spu id
     * @return 操作结果
     */
    @PutMapping("/pull/{id}")
    public Result pull(@PathVariable Long id){
        //批量上架
        spuService.pull(id);
        return new Result(true, StatusCode.OK, "下架成功！");
    }

    //删除goods分为逻辑删除和物理删除，通常使用逻辑删除
    /***
     * 逻辑删除goods数据
     * @param id 查看对象
     * @return 操作结果
     */
    @DeleteMapping("/logic/delete/{id}")
    public Result logicDelete(@PathVariable Long id){
        spuService.logicDelete(id);
        return new Result(true, StatusCode.OK, "逻辑删除成功！");
    }

    /***
     * 还原删除商品
     * @param id 查看对象
     * @return 操作结果
     */
    //删除goods分为逻辑删除和物理删除，通常使用逻辑删除
    @PutMapping("/restore/{id}")
    public Result restore(@PathVariable Long id){
        spuService.restore(id);
        return new Result(true, StatusCode.OK, "还原成功！");
    }
}
